package com.spsa.vista.controladores;

import java.io.IOException;

import javax.ejb.EJB;
import javax.faces.application.ConfigurableNavigationHandler;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ComponentSystemEvent;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.primefaces.context.RequestContext;

import com.spsa.excepciones.ServicioException;
import com.spsa.negocio.gestores.GestorUsuarios;
import com.spsa.persistencia.entidades.Usuario;
import com.spsa.vista.utilidades.MensajesJSF;

@ManagedBean(name = "backLogin")
@SessionScoped
public class ControladorLogin {
	static final Logger logger = LogManager.getLogger(ControladorLogin.class.getName());

	private Usuario usuario;
	@EJB
	private GestorUsuarios gestorUsuarios;
	private String username;
	private String password;

	public void login() {
		try {
			usuario = gestorUsuarios.buscar(username, password);

			if (usuario != null) {
				if (usuario.estaBloqueado()) {
					usuario = null;
					logger.info("Login correcto pero el usuario esta bloqueado. " + usuario);
					MensajesJSF.mostrarMensaje("Login", "El usuario " + username + " esta bloqueado");
					RequestContext.getCurrentInstance().addCallbackParam("loggedIn", false);
				} else {
					logger.info("Login correcto. " + usuario);
					MensajesJSF.mostrarMensaje("Login", "Bienvenido " + username);
					RequestContext.getCurrentInstance().addCallbackParam("loggedIn", true);
					redigirPagina("monitor.xhtml");
				}
			} else {
				logger.info("Login incorrecto. Username: " + username + " Password: " + password);
				MensajesJSF.mostrarMensaje("Login", "Credenciales incorrectas");
				RequestContext.getCurrentInstance().addCallbackParam("loggedIn", false);
			}

		} catch (ServicioException e) {
			MensajesJSF.mostrarError("Login", e.getMessage());
		}
	}

	public void logout() {
		usuario = null;
		redigirPagina("login.xhtml");
	}

	public void verificarAccesoMonitor(ComponentSystemEvent event) {
		if (usuario == null) {
			redigirPagina("login.xhtml");
		} else {
			if (!usuario.getPerfil().tienePermisoParaAcceder("monitor.xhtml"))
				redigirPagina("sinpermiso.xhtml");
		}
	}

	public void verificarAccesoTiendas(ComponentSystemEvent event) {
		if (usuario == null) {
			redigirPagina("login.xhtml");
		} else {
			if (!usuario.getPerfil().tienePermisoParaAcceder("tiendas.xhtml"))
				redigirPagina("sinpermiso.xhtml");
		}
	}

	public void verificarAccesoUsuarios(ComponentSystemEvent event) {
		if (usuario == null) {
			redigirPagina("login.xhtml");
		} else {
			if (!usuario.getPerfil().tienePermisoParaAcceder("usuarios.xhtml"))
				redigirPagina("sinpermiso.xhtml");
		}
	}

	public void verificarAccesoDestinatarios(ComponentSystemEvent event) {
		if (usuario == null) {
			redigirPagina("login.xhtml");
		} else {
			if (!usuario.getPerfil().tienePermisoParaAcceder("destinatarios.xhtml"))
				redigirPagina("sinpermiso.xhtml");
		}
	}

	public void verificarAccesoHistorial(ComponentSystemEvent event) {
		if (usuario == null) {
			redigirPagina("login.xhtml");
		} else {
			if (!usuario.getPerfil().tienePermisoParaAcceder("HistorialReportes.xhtml"))
				redigirPagina("sinpermiso.xhtml");
		}
	}

	public void yaInicioSesion(ComponentSystemEvent event) {
		if (usuario != null && usuario.getPerfil().tienePermisoParaAcceder("monitor.xhtml") && !usuario.estaBloqueado()) {
			redigirPagina("monitor.xhtml");
		}
	}

	private void redigirPagina(String nombrePagina) {
		ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
		try {
			ec.redirect(ec.getRequestContextPath() + "/faces/" + nombrePagina);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
}
